package cn.lcsjsxy.yxc.incommonuse.StringBuffer;

import org.junit.jupiter.api.Test;

/**
 * 关于StringBuffer和StingBuilder的使用
 */
public class StringBufferBuilderTest {
    public StringBufferBuilderTest() {
        super();
    }

    /*
    * String、StringBuffer、StringBuilder三者的异同
    * String：不可变的字符序列；底层使用char[]存储
    * StringBuffer：可变的字符序列：线程安全的，效率偏低。底层使用char[]存储
    * StringBuilder：可变的字符序列，jdk5.0新增，线程不安全的，效率高。底层使用char[]存储
    * 效率对比：
    * 从高到低：StringBuilder>StringBuffer>String
    *
    * 源码分析：
    * String str=new String();  //new char[0]
    * String str1=new String("abc");  //new char[]{'com.yang_xc.a','b','c'};
    *
    * StringBuffer sb1=new StringBuffer();  //char[] value=new char[16];底层创建了一个长度是16的数组
    * sb1.append('com.yang_xc.a');  //value[0]='com.yang_xc.a';
    * sb1.append('b');  //value[i]='b';
    *
    * StringBuffer sb2=new StringBuffer("abc");  //char[] value=new char["abc".length+16]
    *
    * //问题1、System.out.println(sb2.length());  //3
    * //问题2、扩容问题：如果要添加的数据底层数组空间不足，那就需要扩容底层的数组
    *         默认情况下，扩容为原来容量的2倍+2，同时将原有数组中的元素复制到新的数组中
    *         指导意义：开发中建议大家使用：StringBuffer（int capacity）或StringBuilder(int capacity)
    * */
    @Test
    public void test(){
        StringBuffer sb1=new StringBuffer("abc");
        sb1.setCharAt(0,'m');
        System.out.println(sb1);

        StringBuffer sb2=new StringBuffer("abc][][][");
        System.out.println(sb2.length());
    }


    /*
    *   StringBuffer常用方法：
    * StringBuffer append（xxx）：提供了很多的append（）方法，用于进行字符串拼接
    * StringBuffer delete（int start，int end）：删除指定位置的内容
    * StringBuffer replace（int start,int end,String str）:把[start,end]位置替换为str
    * StringBuffer insert（int offset，xxx）：在指定位置插入xxx
    * StringBuffer reverse（）：把当前字符序列逆转
    * public int indexOf（String str）：返回一个指定字符串首次出现的位置
    * public String substring（int start，int end）：返回一个从start开始到end索引结束的左闭右开区间的子字符串
    * public int length（）：返回长度
    * public char charAt（int n）：返回某索引处的字符
    * public void setCharAt（int n，char ch）：将指定位置的字符改成新的
    *       总结：
    *       增：append(xxx)
    *       删：delete(int start，int end)
    *       改：setCharAt（int n，char ch）/replace（int start,int end,String str）
    *       查：charAt（int n）
    *       插：insert（int offset，xxx）
    *       长度：length（）
    *       遍历：for charAt（int n）/toString
    * */
    @Test
    public void test1(){
        StringBuffer sb1=new StringBuffer("abc");
        sb1.append(1);
        sb1.append('1');
        System.out.println(sb1);
        sb1.delete(2,4);
        System.out.println(sb1);
        sb1.replace(1,3,"you");
        System.out.println(sb1);
        sb1.insert(2,"hello");
        System.out.println(sb1);
        sb1.reverse();
        System.out.println(sb1);
    }
}
